{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "电影数目（有名称）：33258\n",
      "电影数目（没有名称）：24166\n",
      "电影数目（总计）：57424\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>movieId</th>\n",
       "      <th>title</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>14847</th>\n",
       "      <td>14847</td>\n",
       "      <td>Lundi matin</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30719</th>\n",
       "      <td>30719</td>\n",
       "      <td>RHプラス</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12977</th>\n",
       "      <td>12977</td>\n",
       "      <td>岁月惊浪/浪潮王子The Prince of Tides</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36987</th>\n",
       "      <td>36987</td>\n",
       "      <td>the lost empire</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4763</th>\n",
       "      <td>4763</td>\n",
       "      <td>The Sword of Doom</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>47265</th>\n",
       "      <td>47265</td>\n",
       "      <td>How Now Boing Boing</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30681</th>\n",
       "      <td>30681</td>\n",
       "      <td>母鸡搬家</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11407</th>\n",
       "      <td>11407</td>\n",
       "      <td>Les amants réguliers</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45503</th>\n",
       "      <td>45503</td>\n",
       "      <td>Through My Eyes</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23705</th>\n",
       "      <td>23705</td>\n",
       "      <td>Je ne suis pas là pour être aimé</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       movieId                             title\n",
       "14847    14847                       Lundi matin\n",
       "30719    30719                             RHプラス\n",
       "12977    12977      岁月惊浪/浪潮王子The Prince of Tides\n",
       "36987    36987                   the lost empire\n",
       "4763      4763                 The Sword of Doom\n",
       "47265    47265               How Now Boing Boing\n",
       "30681    30681                              母鸡搬家\n",
       "11407    11407              Les amants réguliers\n",
       "45503    45503                   Through My Eyes\n",
       "23705    23705  Je ne suis pas là pour être aimé"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "movies = pd.read_csv( './data/douban/movies.csv')\n",
    "\n",
    "print('电影数目（有名称）：%d' % movies[~pd.isnull(movies.title)].shape[0])\n",
    "print('电影数目（没有名称）：%d' % movies[pd.isnull(movies.title)].shape[0])\n",
    "print('电影数目（总计）：%d' % movies.shape[0])\n",
    "movies.sample(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "用户数据：28718\n",
      "电影数据：57424\n",
      "评分数目：2828500\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>userId</th>\n",
       "      <th>movieId</th>\n",
       "      <th>rating</th>\n",
       "      <th>timestamp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>1318222486</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>1313813583</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>5</td>\n",
       "      <td>1313458035</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>5</td>\n",
       "      <td>1313327802</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "      <td>1312126734</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   userId  movieId  rating   timestamp\n",
       "0       0        0       5  1318222486\n",
       "1       0        1       4  1313813583\n",
       "2       0        2       5  1313458035\n",
       "3       0        3       5  1313327802\n",
       "4       0        4       3  1312126734"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ratings = pd.read_csv('./data/douban/ratings.csv')\n",
    "print('用户数据：%d' % ratings.userId.unique().shape[0])\n",
    "print('电影数据：%d' % ratings.movieId.unique().shape[0])\n",
    "print('评分数目：%d' % ratings.shape[0])\n",
    "ratings.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f15022a24a8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rc(\"font\", size=15)\n",
    "ratings.rating.value_counts(sort=False).plot(kind='bar')\n",
    "plt.title('Rating Distribution\\n')\n",
    "plt.xlabel('Rating')\n",
    "plt.ylabel('Count')\n",
    "plt.savefig('system1.png', bbox_inches='tight')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>movieId</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>150</th>\n",
       "      <td>6574</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>415</th>\n",
       "      <td>6003</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>414</th>\n",
       "      <td>5994</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>5274</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>93</th>\n",
       "      <td>5072</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         rating\n",
       "movieId        \n",
       "150        6574\n",
       "415        6003\n",
       "414        5994\n",
       "19         5274\n",
       "93         5072"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rating_count = pd.DataFrame(ratings.groupby('movieId')['rating'].count())\n",
    "rating_count.sort_values('rating', ascending=False).head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>movieId</th>\n",
       "      <th>title</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>150</td>\n",
       "      <td>The Shawshank Redemption</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>415</td>\n",
       "      <td>Léon</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>414</td>\n",
       "      <td>Forrest Gump</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>19</td>\n",
       "      <td>Inception</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>93</td>\n",
       "      <td>Le fabuleux destin d\\'Amélie Poulain</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   movieId                                 title\n",
       "0      150              The Shawshank Redemption\n",
       "1      415                                  Léon\n",
       "2      414                          Forrest Gump\n",
       "3       19                             Inception\n",
       "4       93  Le fabuleux destin d\\'Amélie Poulain"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "most_rated_movies = pd.DataFrame([150, 415, 414, 19, 93], index=np.arange(5), columns = ['movieId'])\n",
    "most_rated_movies_summary = pd.merge(most_rated_movies, movies, on='movieId')\n",
    "most_rated_movies_summary"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>rating</th>\n",
       "      <th>ratingCount</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>movieId</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>150</th>\n",
       "      <td>4.747642</td>\n",
       "      <td>6574</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>415</th>\n",
       "      <td>4.678161</td>\n",
       "      <td>6003</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>414</th>\n",
       "      <td>4.662829</td>\n",
       "      <td>5994</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>4.591771</td>\n",
       "      <td>5274</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>93</th>\n",
       "      <td>4.523265</td>\n",
       "      <td>5072</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           rating  ratingCount\n",
       "movieId                       \n",
       "150      4.747642         6574\n",
       "415      4.678161         6003\n",
       "414      4.662829         5994\n",
       "19       4.591771         5274\n",
       "93       4.523265         5072"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "average_rating = pd.DataFrame(ratings.groupby('movieId')['rating'].mean())\n",
    "average_rating['ratingCount'] = pd.DataFrame(ratings.groupby('movieId')['rating'].count())\n",
    "average_rating.sort_values('ratingCount', ascending=False).head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1502309cc0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10,6))\n",
    "plt.scatter(average_rating.rating,average_rating.ratingCount)\n",
    "plt.xlabel('average rating')\n",
    "plt.ylabel('rating count')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "user_rating_count = ratings['userId'].value_counts()\n",
    "ratings = ratings[ratings['userId'].isin(user_rating_count[user_rating_count >= 10].index)]\n",
    "\n",
    "movied_rating_counts = ratings['movieId'].value_counts()\n",
    "ratings = ratings[ratings['movieId'].isin(movied_rating_counts[movied_rating_counts >= 10].index)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(18378, 19454)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>movieId</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>10</th>\n",
       "      <th>...</th>\n",
       "      <th>45851</th>\n",
       "      <th>46047</th>\n",
       "      <th>46054</th>\n",
       "      <th>46128</th>\n",
       "      <th>46213</th>\n",
       "      <th>46618</th>\n",
       "      <th>47135</th>\n",
       "      <th>47650</th>\n",
       "      <th>47709</th>\n",
       "      <th>57167</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>userId</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 19454 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "movieId  0      1      2      3      4      5      6      8      9      10     \\\n",
       "userId                                                                          \n",
       "0          5.0    4.0    5.0    5.0    3.0    4.0    4.0    5.0    3.0    5.0   \n",
       "1          0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0   \n",
       "2          0.0    0.0    0.0    0.0    0.0    3.0    0.0    0.0    4.0    4.0   \n",
       "3          0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    1.0   \n",
       "4          0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0   \n",
       "\n",
       "movieId  ...    45851  46047  46054  46128  46213  46618  47135  47650  47709  \\\n",
       "userId   ...                                                                    \n",
       "0        ...      0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0   \n",
       "1        ...      0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0   \n",
       "2        ...      0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0   \n",
       "3        ...      0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0   \n",
       "4        ...      0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0   \n",
       "\n",
       "movieId  57167  \n",
       "userId          \n",
       "0          0.0  \n",
       "1          0.0  \n",
       "2          0.0  \n",
       "3          0.0  \n",
       "4          0.0  \n",
       "\n",
       "[5 rows x 19454 columns]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ratings_pivot = ratings.pivot(index='userId', columns='movieId',values='rating').fillna(0)\n",
    "userID = ratings_pivot.index\n",
    "movieId = ratings_pivot.columns\n",
    "print(ratings_pivot.shape)\n",
    "ratings_pivot.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "黃飛鴻之三獅王爭霸\n",
      "         pearsonR  ratingCount\n",
      "movieId                       \n",
      "2550     1.000000          768\n",
      "2552     0.768851          655\n",
      "3143     0.711899          680\n",
      "639      0.683292          863\n",
      "3874     0.640553          719\n",
      "3732     0.639176          541\n",
      "1815     0.601323          622\n",
      "2553     0.582900          532\n",
      "2547     0.570718          581\n",
      "3072     0.528288          507\n",
      "2956     0.524879          579\n"
     ]
    }
   ],
   "source": [
    "example_movieId=2550\n",
    "bones_ratings = ratings_pivot[example_movieId]\n",
    "similar_to_bones = ratings_pivot.corrwith(bones_ratings)\n",
    "\n",
    "corr_bones = pd.DataFrame(similar_to_bones, columns=['pearsonR'])\n",
    "corr_bones.dropna(inplace=True)\n",
    "corr_summary = corr_bones.join(average_rating['ratingCount'])\n",
    "pearson_corr=corr_summary[corr_summary['ratingCount']>=500].sort_values('pearsonR', ascending=False).head(11)\n",
    "print(movies[movies.movieId == example_movieId]['title'].values[0])\n",
    "print(pearson_corr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "黃飛鴻之三獅王爭霸\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>movieId</th>\n",
       "      <th>title</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2552</td>\n",
       "      <td>黃飛鴻之二男兒當自強</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>3143</td>\n",
       "      <td>黃飛鴻</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>639</td>\n",
       "      <td>方世玉</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3874</td>\n",
       "      <td>太极张三丰</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3732</td>\n",
       "      <td>方世玉续集</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1815</td>\n",
       "      <td>精武英雄</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>2553</td>\n",
       "      <td>新少林五祖</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>2547</td>\n",
       "      <td>倚天屠龍記之魔教教主</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>3072</td>\n",
       "      <td>中南海保镖</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>2956</td>\n",
       "      <td>红番区</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   movieId       title\n",
       "0     2552  黃飛鴻之二男兒當自強\n",
       "1     3143         黃飛鴻\n",
       "2      639         方世玉\n",
       "3     3874       太极张三丰\n",
       "4     3732       方世玉续集\n",
       "5     1815        精武英雄\n",
       "6     2553       新少林五祖\n",
       "7     2547  倚天屠龍記之魔教教主\n",
       "8     3072       中南海保镖\n",
       "9     2956         红番区"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(movies[movies.movieId == example_movieId]['title'].values[0])\n",
    "corr_movie_ids=pearson_corr.index\n",
    "movie_corr = pd.DataFrame(corr_movie_ids[1:], index=np.arange(10), columns=['movieId'])\n",
    "corr_movies = pd.merge(movie_corr, movies, on='movieId')\n",
    "corr_movies"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
